/*
 * Copyright (C) 2008 Alessandro Sivieri <alessandro.sivieri@chimera-bellerofonte.eu>.
 *
 *  This file is part of Daex.
 *
 *  Daex is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  Foobar is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
 */
package eu.chimera_bellerofonte.tesi.ui;

import java.awt.Component;
import java.io.File;

import javax.swing.ImageIcon;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.filechooser.FileFilter;

import eu.chimera_bellerofonte.tesi.DaexIcon;


/**
 * Classe di definizione di metodi di utilita' per il lancio
 * di finestre per la selezione di files e cartelle per azioni
 * di salvataggio/caricamento.
 * 
 * @author Sivieri Alessandro
 * @author Vitucci Nicola
 * @version 19/mag/07
 */
public class FileChooserUtility
{
	/**
	 * Metodo per la richiesta di caricamento di un file o di
	 * una directory dal sistema.
	 * 
	 * @param c il componente da utilizzare come "padre" della finestra
	 * @param initialDir la directory iniziale; viene settata solo se esiste
	 * @param windowTitle il titolo da dare alla finestra
	 * @param singleSelection abilitare la selezione di uno o piu' files
	 * @param dirSelection aprire una directory anziche' un file
	 * @return un array di files selezionati (1 o piu')
	 */
	public static String[] loadFile(Component c, String initialDir, String windowTitle, boolean singleSelection, boolean dirSelection)
	{
		JFileChooser chooser=new JFileChooser();
		File current=new File(initialDir);
		if(current.exists())
		{
			chooser.setCurrentDirectory(current);
		}
		chooser.setDialogTitle(windowTitle);
		chooser.setDialogType(JFileChooser.OPEN_DIALOG);
		if(dirSelection)
		{
			chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
		}
		else
		{
			chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
		}
		if(singleSelection)
		{
			chooser.setMultiSelectionEnabled(false);
		}
		else
		{
			chooser.setMultiSelectionEnabled(true);
		}
		int value=chooser.showDialog(c, null);
		if(value==JFileChooser.APPROVE_OPTION)
		{
			File[] files;
			if(singleSelection)
			{
				files=new File[1];
				files[0]=chooser.getSelectedFile();
			}
			else
			{
				files=chooser.getSelectedFiles();
			}
			String[] result=new String[files.length];
			for(int i=0; i<files.length; i++)
			{
				result[i]=files[i].getAbsolutePath();
			}
			return result;
		}
		else
		{
			return new String[0];
		}
	}
	
	/**
	 * Metodo per la richiesta di caricamento di un file o di
	 * una directory dal sistema. Questa versione aggiunge dei
	 * filtri alle possibilita' di selezione, togliendo naturalmente
	 * la possibilita' di aprire directory.
	 * 
	 * @param c il componente da utilizzare come "padre" della finestra
	 * @param initialDir la directory iniziale; viene settata solo se esiste
	 * @param windowTitle il titolo da dare alla finestra
	 * @param filters filtri per la selezione dei files
	 * @param singleSelection abilitare la selezione di uno o piu' files
	 * @return un array di files selezionati (1 o piu')
	 */
	public static String[] loadFile(Component c, String initialDir, String windowTitle, String[] filters, boolean singleSelection)
	{
		JFileChooser chooser=new JFileChooser();
		File current=new File(initialDir);
		if(current.exists())
		{
			chooser.setCurrentDirectory(current);
		}
		chooser.setDialogTitle(windowTitle);
		chooser.setDialogType(JFileChooser.OPEN_DIALOG);
		chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
		if(singleSelection)
		{
			chooser.setMultiSelectionEnabled(false);
		}
		else
		{
			chooser.setMultiSelectionEnabled(true);
		}
		for(String s: filters)
			chooser.setFileFilter(new UtilityFileFilter(s));
		int value=chooser.showDialog(c, null);
		if(value==JFileChooser.APPROVE_OPTION)
		{
			File[] files;
			if(singleSelection)
			{
				files=new File[1];
				files[0]=chooser.getSelectedFile();
			}
			else
			{
				files=chooser.getSelectedFiles();
			}
			String[] result=new String[files.length];
			for(int i=0; i<files.length; i++)
			{
				result[i]=files[i].getAbsolutePath();
			}
			return result;
		}
		else
		{
			return new String[0];
		}
	}
	
	/**
	 * Metodo per la richiesta di salvataggio di un file nel
	 * sistema.
	 * 
	 * @param c il componente da utilizzare come "padre" della finestra
	 * @param initialDir la directory iniziale; viene settata solo se esiste
	 * @param initialFile il file da visualizzare immediatamente
	 * @param windowTitle il titolo da dare alla finestra
	 * @return il file selezionato per il salvataggio
	 */
	public static String saveFile(Component c, String initialDir, String initialFile, String windowTitle)
	{
		JFileChooser chooser=new JFileChooser();
		File current=new File(initialDir);
		if(current.exists())
		{
			chooser.setCurrentDirectory(current);
		}
		chooser.setSelectedFile(new File(initialFile));
		chooser.setDialogTitle(windowTitle);
		chooser.setDialogType(JFileChooser.SAVE_DIALOG);
		chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
		int value=chooser.showDialog(c, null);
		if(value==JFileChooser.APPROVE_OPTION)
		{
			if(chooser.getSelectedFile().exists())
			{
				value=JOptionPane.showConfirmDialog(c, "Il file esiste gia', vuoi sovrascrivere?", "Il file esiste", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, new ImageIcon(DaexIcon.WARNING));
				if(value==JOptionPane.YES_OPTION)
				{
					return chooser.getSelectedFile().getAbsolutePath();
				}
			}
			else
			{
				return chooser.getSelectedFile().getAbsolutePath();
			}
		}
		return null;
	}
	
	/**
	 * Metodo per la richiesta di salvataggio di un file nel
	 * sistema. Questa versione aggiunge un filtro alle possibili
	 * estensioni.
	 * 
	 * @param c il componente da utilizzare come "padre" della finestra
	 * @param initialDir la directory iniziale; viene settata solo se esiste
	 * @param initialFile il file da visualizzare immediatamente
	 * @param windowTitle il titolo da dare alla finestra
	 * @param filter il filtro per l'estensione dei files
	 * @return il file selezionato per il salvataggio
	 */
	public static String saveFile(Component c, String initialDir, String initialFile, String windowTitle, String filter)
	{
		String dotfilter;
		if(filter.charAt(0)=='.')
		{
			dotfilter=filter;
		}
		else
		{
			dotfilter="."+filter;
		}
		JFileChooser chooser=new JFileChooser();
		File current=new File(initialDir);
		if(current.exists())
		{
			chooser.setCurrentDirectory(current);
		}
		chooser.setSelectedFile(new File(initialFile));
		chooser.setDialogTitle(windowTitle);
		chooser.setDialogType(JFileChooser.SAVE_DIALOG);
		chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
		chooser.addChoosableFileFilter(new UtilityFileFilter(dotfilter));
		int value=chooser.showDialog(c, null);
		if(value==JFileChooser.APPROVE_OPTION)
		{
			if(chooser.getSelectedFile().exists())
			{
				value=JOptionPane.showConfirmDialog(c, "Il file esiste gia', vuoi sovrascrivere?", "Il file esiste", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, new ImageIcon(DaexIcon.WARNING));
				if(value==JOptionPane.YES_OPTION)
				{
					if(chooser.getSelectedFile().getAbsolutePath().endsWith(dotfilter))
					{
						return chooser.getSelectedFile().getAbsolutePath();
					}
					else
					{
						return chooser.getSelectedFile().getAbsolutePath()+dotfilter;
					}
				}
			}
			else
			{
				if(chooser.getSelectedFile().getAbsolutePath().endsWith(dotfilter))
				{
					return chooser.getSelectedFile().getAbsolutePath();
				}
				else
				{
					return chooser.getSelectedFile().getAbsolutePath()+dotfilter;
				}
			}
		}
		return null;
	}
	
	/**
	 * Classe di utilita' per la creazione rapida di filtri per
	 * la visualizzazione nelle finestre di caricamento e 
	 * salvataggio.
	 * 
	 * @author Sivieri Alessandro
	 * @author Vitucci Nicola
	 * @version 19/mag/07
	 */
	private static class UtilityFileFilter extends FileFilter
	{
		private String type=null;
		
		/**
		 * Costruttore; setta gli attributi di classe con i
		 * valori specificati.
		 * 
		 * @param type il tipo da filtrare
		 */
		public UtilityFileFilter(String type)
		{
			if(type.charAt(0)=='.')
			{
				this.type=type;
			}
			else
			{
				this.type="."+type;
			}
		}

		/**
		 * @see javax.swing.filechooser.FileFilter#accept(java.io.File)
		 */
		@Override
		public boolean accept(File f)
		{
			return ( f.isDirectory() || f.getName().endsWith(type) ) ? true : false;
		}

		/**
		 * @see javax.swing.filechooser.FileFilter#getDescription()
		 */
		@Override
		public String getDescription()
		{
			return type+" files";
		}
		
	}
	
}
